#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @FileName  :stack.py
# @Time      :2021/3/20 21:51
# @Author    :Letquit
"""
文件说明：栈

"""
# 调用栈
def greet(name):    # maggie被储存到name中
    print("hello, " + name + "!")   # 打印hello, maggie!
    greet2(name)    # 也为greet2函数分配一块内存
    print("getting ready to say bye...")    # 执行完函数greet2后，返回到函数greet，并从离开的地方开始接着往下执行
    bye()   # 在栈顶添加了函数bye的内存块
#     由于没有别的事情要做，就从函数greet返回。
# 这个栈用于存储多个函数的变量，被称为调用栈
def greet2(name):   # 当调用函数greet2式，函数greet只执行了一部分
    print("how are you, " + name + "?")     # 从函数调用返回，此时，栈顶的内存块被弹出
'''
    重要概念：
        调用另一个函数时，当前函数暂停并处于未完成状态
        该函数的所有变量的值还在内存中
'''
def bye():
    print("ok bye!")    # 打印ok bye!并从这个函数返回
greet("maggie")    # 首先为greet函数分配一块内存


# 递归调用栈
def fact(x):    # 第一次调用时factx为3     对fact的第二次调用中x为2(fact(2)为栈顶)
    if x == 1:
        return 1    # 从fact(1)中返回1  现在有三个对fact的调用，但换没有一个调用结束
    else:   # x为调用fact(2)时的2 * 从fact(1)中返回的1 = 返回2
        return x * fact(x - 1)  # 递归调用  两次调用的函数都有变量x，但这些x变量的值不同 在fact(1)调用中不能访问fact(2)变量，反之亦然
#       x为调用fact(3)时的3 * 从fact(2)中返回的2 = 返回6


print(fact(3))
# 注意，每个fact调用都有自己的x变量。在一个函数的调用在不能访问另一个的x变量
'''
    存储详尽的信息可能占用大量的内存。
    每个函数调用都要占用一定的内存，如果栈很高，就意味着计算机存储了大量函数调用的信息。
    · 重新编写代码，转而使用循环
    · 使用尾递归 (并非所有语言都支持尾递归)
'''


'''
    小结：
        · 递归指的是调用自己的函数。
        · 每个递归函数都有两个条件：基线条件和递归条件。
        · 栈有两种操作：压入和弹出。
        · 所有函数都进入调用栈
        · 调用栈可能很长，这将占用大量的内存。
'''
if __name__ == "__main__":
    run_code = 0
